import { AvatarDropdown, AvatarName, Footer, Question } from '@/components';
import { currentUser as queryCurrentUser } from '@/services/ant-design-pro/api';
import { LinkOutlined } from '@ant-design/icons';
import type { Settings as LayoutSettings } from '@ant-design/pro-components';
import { SettingDrawer } from '@ant-design/pro-components';
import '@ant-design/v5-patch-for-react-19';
import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max';
import { history, Link, useModel } from '@umijs/max';
import defaultSettings from '../config/defaultSettings';
import { errorConfig } from './requestErrorConfig';
import type { RouteObject } from 'react-router';
const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/user/login';

/**
 * @see https://umijs.org/docs/api/runtime-config#getinitialstate
 * */
export async function getInitialState(): Promise<{
	settings?: Partial<LayoutSettings>;
	currentUser?: API.CurrentUser;
	loading?: boolean;
	fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
	const fetchUserInfo = async () => {
		try {
			const msg = await queryCurrentUser({
				skipErrorHandler: true,
			});
			return msg.data;
		} catch (_error) {
			history.push(loginPath);
		}
		return undefined;
	};
	// 如果不是登录页面，执行
	const { location } = history;
	if (![loginPath, '/user/register', '/user/register-result'].includes(location.pathname)) {
		const currentUser = await fetchUserInfo();
		return {
			fetchUserInfo,
			currentUser,
			settings: defaultSettings as Partial<LayoutSettings>,
		};
	}
	return {
		fetchUserInfo,
		settings: defaultSettings as Partial<LayoutSettings>,
	};
}

// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
	const { getAllDict } = useModel('dict');


	return {
		actionsRender: () => [<Question key="doc" />],
		avatarProps: {
			src: initialState?.currentUser?.avatar,
			title: <AvatarName />,
			render: (_, avatarChildren) => {
				return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
			},
		},
		menu: {
			async request(params, defaultMenuData) {
				await getAllDict();
				return defaultMenuData;
			},
		},
		waterMarkProps: {
			content: initialState?.currentUser?.name,
		},
		footerRender: () => <Footer />,
		onPageChange: () => {
			const { location } = history;
			// 如果没有登录，重定向到 login
			if (!initialState?.currentUser && location.pathname !== loginPath) {
				history.push(loginPath);
			}
		},
		bgLayoutImgList: [
			{
				src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
				left: 85,
				bottom: 100,
				height: '303px',
			},
			{
				src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
				bottom: -68,
				right: -45,
				height: '303px',
			},
			{
				src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
				bottom: 0,
				left: 0,
				width: '331px',
			},
		],
		links: isDev
			? [
				<Link key="openapi" to="/umi/plugin/openapi" target="_blank">
					<LinkOutlined />
					<span>OpenAPI 文档</span>
				</Link>,
			]
			: [],
		menuHeaderRender: undefined,
		// 自定义 403 页面
		unAccessible: <div>unAccessible： 403 无权限</div>,
		// 增加一个 loading 的状态
		childrenRender: (children) => {
			// if (initialState?.loading) return <PageLoading />;
			return (
				<>
					{children}
					{isDev && (
						<SettingDrawer
							disableUrlParams
							enableDarkTheme
							settings={initialState?.settings}
							onSettingChange={(settings) => {
								setInitialState((preInitialState) => ({
									...preInitialState,
									settings,
								}));
							}}
						/>
					)}
				</>
			);
		},
		...initialState?.settings,
	};
};

/**
 * @name request 配置，可以配置错误处理
 * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
 * @doc https://umijs.org/docs/max/request#配置
 */
export const request: RequestConfig = {
	// baseURL: 'https://proapi.azurewebsites.net',
	...errorConfig,
};

// 自定义路由类型
type CustomRoute = RouteObject & { access?: string };
/**
 * 动态修改路由, 追加后端菜单
 */
export async function patchClientRoutes({ routes }: { routes: CustomRoute[] }) {
	const userRoutes = routes.find(el => el.path == '/')?.children ?? [];
	// 根据服务端请求,过滤本地路由; @Test-todo: 暂未实现嵌套过滤
	const filterServerMenus = (serverMenus: any[], localRoutes: CustomRoute[]) => {
		for (let menu of serverMenus) {
			const matchIndex = localRoutes.findIndex(el => el.path == menu.path);
			if (matchIndex != -1) {
				delete localRoutes[matchIndex].access;
			}
		}
	}

	const { data: userData } = await queryCurrentUser({
		skipErrorHandler: true,
	});

	const serverMenus = userData.menus;
	filterServerMenus(serverMenus, userRoutes as CustomRoute[]);
}

